package cn.edu.sdjzu.xg23.kcsj01_backend.utils;

import cn.edu.sdjzu.xg23.kcsj01_backend.exception.JwtAuthenticationException;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import org.springframework.stereotype.Component;

import java.security.Key;
import java.util.*;
import java.util.stream.Collectors;

@Component
public class JwtUtil {
    private final Key signingKey;
    private final long expiration = 3600; // 过期时间（秒）
    private static final String PERMISSIONS_CLAIM = "permissions";

    public JwtUtil() {
        this.signingKey = Keys.secretKeyFor(SignatureAlgorithm.HS512);
    }

    // 生成 Token（基础方法）
    public String generateToken(String username) {
        return generateToken(username, Collections.emptyList());
    }

    // 生成 Token（重载方法，只存储权限）
    public String generateToken(String username, List<String> permissions) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("sub", username);
        claims.put("iat", new Date());
        claims.put(PERMISSIONS_CLAIM, permissions); // 只保留权限列表

        return Jwts.builder()
                .setClaims(claims)
                .setExpiration(new Date(System.currentTimeMillis() + expiration * 1000))
                .signWith(signingKey, SignatureAlgorithm.HS512)
                .compact();
    }

    // 解析 Token（抛出异常）
    public Claims parseToken(String token) {
        try {
            return Jwts.parserBuilder()
                    .setSigningKey(signingKey)
                    .build()
                    .parseClaimsJws(token)
                    .getBody();
        } catch (ExpiredJwtException e) {
            throw new JwtAuthenticationException("Token已过期", e);
        } catch (JwtException | IllegalArgumentException e) {
            throw new JwtAuthenticationException("无效的Token", e);
        }
    }

    // 验证 Token 有效性
    public void validateToken(String token) {
        parseToken(token); // 直接调用parseToken，它会处理所有异常
    }

    // 从 Token 获取用户名
    public String getUsernameFromToken(String token) {
        try {
            return parseToken(token).getSubject();
        } catch (JwtAuthenticationException e) {
            throw e; // 直接抛出，不包装
        }
    }

    // 从 Token 中获取权限列表
    public List<String> getPermissionsFromToken(String token) {
        try {
            Claims claims = parseToken(token);
            Object permissionsObj = claims.get(PERMISSIONS_CLAIM);
            if (permissionsObj instanceof List<?>) {
                List<?> permissionsList = (List<?>) permissionsObj;
                return permissionsList.stream()
                        .filter(o -> o instanceof String)
                        .map(String::valueOf)
                        .collect(Collectors.toList());
            }
            return Collections.emptyList();
        } catch (JwtAuthenticationException e) {
            throw e;
        }
    }

    // 检查 Token 是否过期（简化逻辑）
    public boolean isTokenExpired(String token) {
        try {
            Claims claims = parseToken(token);
            return claims.getExpiration().before(new Date());
        } catch (JwtAuthenticationException e) {
            return true; // 无效Token视为已过期
        }
    }
}